from django.db import models
from django.contrib.auth.models import User  # 使用django自带的用户模型
# Create your models here.


# 文章
# 文章编号：唯一的数字
# 文章标题：字符串，并且需要限制一定的长度
# 文章作者：字符串，关联到用户（一对多）
# 发布时间
# 文章内容
# 文章的标签：关联到标签，可以具有多个标签，标签删除时，文章不受影响（多对多）
# 文章的分类: 关联到类别，只有一个类别，类别删除时，文章为未分类或者把分类下文章都删除（一对多的关系）
class Category(models.Model):
    """文章类别"""
    # unique 字段的唯一约束
    name = models.CharField(verbose_name="类别名称", max_length=20, unique=True)

    class Meta:
        db_table = "category"
        verbose_name_plural = verbose_name = "类别"

    def __str__(self):
        return self.name


class Tag(models.Model):
    """文章标签"""
    name = models.CharField(verbose_name="标签名称", max_length=20, unique=True)

    class Meta:
        db_table = "tag"
        verbose_name_plural = verbose_name = "标签"

    def __str__(self):
        return self.name


class Article(models.Model):
    """文章"""
    title = models.CharField(verbose_name="标题", max_length=50)
    # models.DO_NOTHING 当外键指向的数据对象被删除的时候不做任何处理
    # models.CASCADE 当外键指向的数据对象被删除的时候同时删除关联的对象
    author = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="作者")
    publish_time = models.DateField(verbose_name="发布日期", auto_now=True)
    content = models.TextField(verbose_name="内容")
    # models.SET_DEFAULT  文章类别被删除时使用默认值
    category = models.ForeignKey(Category, on_delete=models.SET_DEFAULT, default=1, verbose_name="类别")
    tag = models.ManyToManyField(Tag, verbose_name="标签")

    class Meta:
        db_table = "article"
        verbose_name_plural = verbose_name = "文章"

    def __str__(self):
        return self.title


class Comment(models.Model):
    """
    评论
    """
    name = models.CharField(verbose_name="用户名称", max_length=20)
    email = models.EmailField(verbose_name="邮箱")
    content = models.TextField(verbose_name="内容")
    publish = models.DateField(verbose_name="评论时间", auto_now=True)
    article = models.ForeignKey(Article, on_delete=models.CASCADE, verbose_name="文章")
    # blank=True django后台添加时可以不填
    reply = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, verbose_name="回复")

    class Meta:
        db_table = "comment"
        verbose_name_plural = verbose_name = "评论"

    def __str__(self):
        return self.name

